8章 分散システムの問題
分散システムを採用する理由
スケーラビリティ
耐障害性
低レイテンシ
分散システムの一般的な問題
ネットワークの信頼性
あるネットワーク上でパケロスや遅延がどれほど発生するかがわからない
クロックの信頼性
ノードのクロックが他のノードと大きくずれていても、クロックの誤差をうまく計る方法がないのでクロックへの依存が危険である
プロセスの信頼性
プロセスは処理中にどれほどの長さ一時停止するかもしれず、他のノードから落ちているとみなされた後に自身に一時停止があったことを理解しないままに復活するかもしれない
安全ではなく、クリティカルではないシステムの多くでは高価な高信頼性より安価な低信頼性が優先
厳密なリアルタイムレスポンスの保証やネットワークの遅延の限定は可能だが負荷が大きくハードウェアリソースの利用率が低下する
分散システムは部分障害への耐性をソフトウェアに組み込み、システムの構成要素が一部破損していてもシステム全体として機能し続けられるようにする。
フォールトに耐えるために
フォールトの検出
唯一の確実な方法はタイムアウト
ではその長さはどれほどにすべきかはわからないので経験的に決めるしかない
フォールトへの耐性
フェンシングトークン
ビザンチン耐性
一部のノードに不具合があってプロトコルに従わなかったり、悪意を持った攻撃者がネットワークにおいて妨害をしたりしているような状況においても正しく動作し続けられること。
ほとんどのサーバサイドシステムではビザンチン耐性を持たせるためのコストを投入することは現実的ではない
クラッシュストップフォールト
クラッシュストップフォールトモデルではノードの障害はただ一つ、クラッシュしかないという前提を置ける。
クラッシュリカバリフォールト
ノードはいつクラッシュするかもわからず、いつになるかはわからないもののレスポンスを再び返し始めるかもしれないという前提を置く。ノードはクラッシュがあっても内容を持つストレージを持つが、メモリに保持されている情報は失われるものと見做される。